/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compilador.analisadorSintatico.comandos;

import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.operacoes.EXP;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author Matheus Cardoso
 * <WHILE> ::= while ‘(‘ <VALOR_LOGIC> ‘)’ <BLOCO>
 */
public class WHILE extends Producao {

    @Override
    public SimboloGramatical derivar() throws Exception {
        //chama o token reader para correr os tokens
        TokenReader tokenReader = TokenReader.getInstance();        

        Token token = null;

        //adiciona o while à árvore
        ((NaoTerminal) simbolo).add(new Terminal(tokenReader.consome()));

        //retorna o token após while mas não move index
        token = tokenReader.seeCurrent();

        if (token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().toString().equals("(")) {

            tokenReader.consome();//avança index
            ((NaoTerminal) simbolo).add(new Terminal(token)); //adiciona ( à árvore                     

        } else {
             erro("Comando condicional" + this.getClass().getSimpleName() + "mal formado - '(' não encontrado");
             return simbolo;
        }

        //adiciona os elementos oriundos da derivação de VALOR_LOGIC
        ((NaoTerminal) simbolo).add(new EXP().derivar());

        token = tokenReader.seeCurrent();
        
        if (token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().equals(")")) {
            tokenReader.consome();//avança index
            ((NaoTerminal) simbolo).add(new Terminal(token)); //adiciona ) à árvore
        } else {
             erro("Comando condicional" + this.getClass().getSimpleName() + "mal formado - ')' não encontrado");
        }

        //adiciona os elementos oriundos da derivação de BLOCO
        ((NaoTerminal) simbolo).add(new BLOCO().derivar()); //

        return simbolo;
    }

    @Override
    public void setSimbolo() {
        simbolo = new NaoTerminal(this.getClass().getSimpleName());
    }
}
